使用篇丨链路追踪(Tracing)很简单:链路拓扑
前文回顾:
最近一年,小玉所在的业务部门发起了轰轰烈烈的微服务化运动,大量业务中台应用被拆分成更细粒度的微服务应用。为了迎接即将到来的双十一大促重保活动,小玉的主管让她在一周内梳理出订单中心的全局关键上下游依赖,提前拉通各方对齐重保方案。这个任务可愁坏了小玉,平时她只与直接上下游业务方打交道,现在要梳理出订单中心完整的依赖路径,头发愁掉了一大把仍然不知道该如何下手。无奈之下,小玉再次求助于万能的小明。
如上图所示,入口应用 A 依赖了多个不同深度的下游应用,并且每次调用的路径并不相同。为了梳理出应用 A 的完整调用依赖,可以将多条调用链聚合成一棵树,从根节点到叶子节点的每条路径都代表着一种流量流转路径,而节点的状态反映了流量的特征,比如次数、耗时、错误率等。通过调用链聚合,综合分析端到端流量路径与状态的方法就是链路拓扑。链路拓扑与调用链的关系就好比样本集与离散样本点,前者反映了整体的分布情况,可以有效避免单个样本随机性对评估结果的影响。
链路拓扑的经典应用场景
Aliware
链路拓扑最核心的价值,就是通过分析节点间依赖路径与状态,提供强弱依赖梳理、瓶颈点分析、影响面分析、故障传播链分析等能力,下面我们来深入了解下这些经典用法。
(一)强弱依赖梳理
根据流量大小进行区分。这是一种简单粗暴的区分方式,大于一定流量阈值或比例的就识别为强依赖,否则视为弱依赖。这种判断方式的好处是简单清晰,可以由链路追踪平台自动识别,无需人力干预。缺点是不够准确,一些特殊的关键依赖虽然流量不大,但是却会直接影响业务的稳定性。
根据同步/异步调用类型进行区分。这种区分方式的好处也是简单、易操作,减少了异步非阻塞(如消息)调用的干扰。缺点是在同步调用为主的业务中筛选效果不佳,而在异步调用为主的业务(红包、热点推送)可能造成误判。
人工标注。鉴于业务的差异性,由业务 Owner 对自身依赖的直接下游的强弱性进行人工标注识别,可靠性会更高。但是这种方式对于人员经验和时间成本要求很高,并且无法自适应业务的变化。
半人工标注。首先由链路追踪平台根据流量大小、同步/异步进行初步的强弱依赖识别,再通过有经验的同学进行人工标注修正。这样既节省了人力成本,也能有限度的自适应未来的业务变化。
(二)瓶颈点/影响面分析
某天上午,应用 A 的管理员收到用户反馈服务响应超时,通过查看链路拓扑状态,发现 A 应用依赖的 D 应用接口变慢,而 D 应用调用数据库接口也出现异常。因此,小 A 通知小 D 即刻排查数据库连接等状态,尽快恢复可用性。这就是一个瓶颈点分析的过程。
由于小 D 业务不熟练,半小时过去了还没有完成有效的恢复动作,并且触发了数据库服务端异常。负责 DB 运维的同学收到数据库服务端告警后,通过链路拓扑向上回溯业务影响面,发现直接依赖的 D、E 两个应用均出现了大量慢 SQL,并导致间接依赖的应用 A、B 出现不同程度的服务响应超时。果断执行了数据库扩容,最终恢复了全部应用的正常访问。这就是通过影响面分析,辅助运维决策的过程。
(三)故障传播链分析
链路拓扑聚合维度
Aliware
链路拓扑的聚合维度决定着拓扑节点的类型,面向不同的用户角色,提供了差异化的分析视角。在实际应用中,最典型的三种链路拓扑聚合维度分别是应用、接口与自定义维度,分别对应着应用拓扑、接口拓扑和业务拓扑。
应用拓扑, 顾名思义就是根据应用名称进行链路聚合,反映了应用间的依赖关系与总体流量状态。由于数据聚合粒度较粗,局部异常会被平均值掩盖,不适合精细化的问题诊断,更适合全局依赖梳理与重大故障定界,用户角色偏向于 PE 运维或 SRE 稳定性负责人。
接口拓扑, 是在服务接口这一维度进行的链路聚合,相比于应用拓扑更贴近研发视角,因为日常迭代的对象通常是某个具体的服务接口,无论是新接口上线、老接口下线或核心接口重保,接口粒度的链路拓扑更符合研发测试流程与职责划分习惯。应用与接口都是链路追踪领域的基础对象,对应的拓扑可以由链路追踪平台自动生成,无需过多的人工干预,使用起来较为方便。
业务拓扑, 是根据自定义维度聚合生成的偏业务视角的链路拓扑,通常比接口维度要更深一级,比如某个下单接口可以根据商品类目维度进一步细分为女装或家电,如下图所示。业务拓扑一般无法由链路追踪平台自动生成,需要用户结合业务特性定制聚合规则。此外,自定义维度的来源比较广泛,可以是手动添加的 Attributes 自定义标签,也可以是 HTTP 请求出入参,或者是所在机器的环境标签。在这方面,开源社区缺乏相应的标准,而各大厂商的商业化实现差异也比较大。
链路拓扑生成方式
Aliware
为了最大程度的保留链路数据的端到端关联信息,链路拓扑通常是基于调用链明细数据直接聚合生成,而不是基于指标数据的二次聚合。细心的读者可能会发现这里隐藏着一个颇具挑战的技术难题,就是如何平衡海量链路数据聚合的实时性、准确性与灵活性。理想情况下,我们希望基于符合条件的全量调用链明细数据快速生成最真实的链路拓扑,实现“又快又准又灵活”。但在实际应用中,鱼与熊掌不可兼得,我们只能在“快”、“准”、“灵活”之间进行抉择,也因此衍生出了不同的链路拓扑生成流派。
(一)实时聚合
(二)离线聚合
(三)预聚合
3D 拓扑
Aliware
流量与资源是一对“好兄弟”,二者密切相关。流量影响着资源分配,而资源反过来又约束着流量状态。大部分流量异常归根结底是资源配额不足或分配不合理导致的,比如峰值流量瞬间耗尽资源,或者流量不均导致的“热点”等。我们在定位流量异常根因的过程中,往往需要结合相对应的资源状态进行分析;反过来,当一个资源节点出现异常时,我们也希望知道它会影响其上运行的哪些流量?因此,在代表流量的链路拓扑上,关联相对应的资源数据,形成更加完整的 3D 拓扑,貌似是个不错的选择。
为了降低 3D 拓扑的交互成本,一种可能的思路是结合智能诊断技术,自动突出异常链路,精准收敛展示数据范围。不过,这对于技术与产品的要求较高,实用性还有待大量真实生产环境的检验。